package fr.uniscol.dao.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import fr.uniscol.dao.IGeographieDao;
import fr.uniscol.dao.UniscolDaoSupport;
import fr.uniscol.dao.mapper.AcademieRowMapper;
import fr.uniscol.dao.mapper.CommuneRowMapper;
import fr.uniscol.dao.mapper.DepartementRowMapper;
import fr.uniscol.dao.mapper.PaysRowMapper;
import fr.uniscol.model.Academie;
import fr.uniscol.model.Commune;
import fr.uniscol.model.Departement;
import fr.uniscol.model.Pays;

@Repository("geoDao")
public class GeographieDaoImpl extends UniscolDaoSupport implements IGeographieDao {

	// Le cache
	private List<Pays> cachePays = null;
	private List<Academie> cacheAcademies = null;
	private List<Departement> cacheDepartements = null;
	private List<Commune> cacheCommunes = null;
	
	protected List<Pays> getCachePays() {
		if(cachePays == null){
			// Load
			cachePays = loadPays();
		}
		return cachePays;
	}
	
	protected  List<Pays> loadPays() {
		
		List<Pays> pays = getJdbcTemplate().query("SELECT * FROM uni_pays", new PaysRowMapper());
		
		return pays;
	}

	protected List<Academie> getCacheAcademies() {
		if(cacheAcademies == null){
			cacheAcademies = loadAcademies();
		}
		return cacheAcademies;
	}
	
	protected List<Academie> loadAcademies() {
		
		List<Academie> academies = getJdbcTemplate().query("SELECT * FROM uni_academie", new AcademieRowMapper());
		
		return academies;
	}

	protected List<Departement> getCacheDepartements() {
		if(cacheDepartements == null){
			cacheDepartements = loadDepartements();
		}
		return cacheDepartements;
	}
	
	protected List<Departement> loadDepartements(){
		
		List<Departement> departements = getJdbcTemplate().query("SELECT * FROM uni_departement", new DepartementRowMapper(this));
		
		return departements;
	}

	protected List<Commune> getCacheCommunes() {
		if(cacheCommunes == null){
			cacheCommunes = loadCommunes();
		}
		return cacheCommunes;
	}

	protected List<Commune> loadCommunes(){
		
		List<Commune> communes = getJdbcTemplate().query("SELECT * FROM uni_commune ", new CommuneRowMapper(this));
		
		return communes;
	}
	
	@Override
	public Pays getPaysById(long id) {
		for(Pays p : getCachePays()){
			if(p.getId() == id){
				return p;
			}
		}
		return null;
	}

	@Override
	public Academie getAcademieById(long id) {
		
		for(Academie a : getCacheAcademies()){
			if(a.getId() == id){
				return a;
			}
		}
		return null;
	}

	@Override
	public Departement getDepartementById(long id) {
		for(Departement d : getCacheDepartements()){
			if(d.getId() == id){
				return d;
			}
		}
		return null;
	}

	@Override
	public Commune getCommuneById(long id) {
		for(Commune c : getCacheCommunes()){
			if(c.getId() == id){
				return c;
			}
		}
		return null;
	}

	@Override
	public List<Pays> getAllPays() {
		return getCachePays();
	}

	@Override
	public List<Academie> getAllAcademies() {
		return getCacheAcademies();
	}

	@Override
	public List<Departement> getAllDepartements() {
		return getCacheDepartements();
	}

	@Override
	public List<Commune> getAllCommunes() {
		return getCacheCommunes();
	}
}
